這次是失敗的先敘述原因和結果:
1.Pay2Go測試平台雖然是可以正常開啟和使用但似乎不能用了?因為在套件pay2go他敘述了『智付寶第三方金流業務已轉移到智付通,請改用 spgateway』。
2.Pay2Go和Spgateway官方API document和實作上幾乎是一樣的,Spgateway甚至還標明了版本更新日期是2018-01-03,但測試站要串的API需要給予『CheckValue』這個文件沒提到的參數,要怎麼算出來的我不知道,所以最終是一直卡在這關。
實作紀錄
這是Pay2go測試平台,這是Spgateway測試平台,兩個都可以直接簡單註冊資料不必填真實,創立商店後主要需拿到:商店編號 MerchantID
串些金鑰 HashKey
串些金鑰 HashIV
可以直接把任何繳費服務都打開(預設應該也都是全部開啟),再來就是去裝套件了。
套件上pay2go和 spgateway兩個文件寫的幾乎一樣,這裡用pay2go做示範。
1 | gem "pay2go" |
$ bundle install
設定整合模式1
2
3
4
5
6Rails.application.configure do
...(略)
config.after_initialize do
Pay2go.integration_mode = :development
end
end
1 | Rails.application.configure do |
加入 pay2go 的 API key$ touch config/initializers/pay2go.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15Pay2go.setup do |pay2go|
if Rails.env.development?
pay2go.merchant_id = "1234567" # 放測試站的 key
pay2go.hash_key = "xxxxxxxx"
pay2go.hash_iv = "xxxxxxxx"
pay2go.service_url = "https://cpayment.pay2go.com/MPG/mpg_gateway"
else
pay2go.merchant_id = "1234567" # 放正式站的 key
pay2go.hash_key = "xxxxxxxx"
pay2go.hash_iv = "xxxxxxxx"
pay2go.service_url = "https://payment.pay2go.com/MPG/mpg_gateway"
end
end
此時先把測試站的MerchantID(商店編號), key 和 iv 貼上去
再來設定信用卡付款按鈕$ mkdir app/services
1 | class Pay2goService |
重開 rails server
新增按鈕的partial1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19<%= form_tag Pay2go.service_url, method: :post do %>
<%= hidden_field_tag "MerchantID", Pay2go.merchant_id %>
<%= hidden_field_tag "HashKey", Pay2go.hash_key %>
<%= hidden_field_tag "HashIV", Pay2go.hash_iv %>
<%= hidden_field_tag "LoginType", "0" %>
<%= hidden_field_tag "RespondType", "JSON" %>
<%= hidden_field_tag "Version", "1.1" %>
<%= hidden_field_tag "ItemDesc", "order_sample" %>
<%= hidden_field_tag "MerchantOrderNo", "#{order.id}s#{Time.now.strftime("%Y%m%d%H%M%S")}" %>
<%= hidden_field_tag "TimeStamp", order.created_at.to_i %>
<%= hidden_field_tag "Amt", order.total %>
<%= hidden_field_tag "CREDIT", "1" %>
<%= hidden_field_tag "ReturnURL", pay2go_cc_notify_order_url(order.token) %>
<%= hidden_field_tag "CheckValue", Pay2goService.new(order).check_value %>
<%= submit_tag "使用信用卡付款", class: "btn btn-danger btn-lg btn-default" %>
<% end %>
然後在想要的頁面的地方render上去1
<%= render "pay_with_credit_card", order: @order %>
加上 controller 的 callbacks1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21...(略)
protect_from_forgery except: :pay2go_cc_notify
...(略)
def pay2go_cc_notify
@order = Order.find_by_token(params[:id])
if params["Status"] == "SUCCESS"
@order.make_payment!
if @order.is_paid?
flash[:notice] = "信用卡付款成功"
redirect_to account_orders_path
else
render text: "信用卡失敗"
end
else
render text: "交易失敗"
end
end
修改routes1
2
3resources :comes do
post :pay2go_cc_notify
end
發現post出去的網址即使剛剛在config/initializers/pay2go.rb
裡面設定pay2go.service_url
測試網址,但他依然post出去的是舊的測試平台網址『https://capi.pay2go.com/MPG/mpg_gateway』。
我就直接把form_tag的action寫死:1
2
3<%= form_tag action="https://cpayment.pay2go.com/MPG/mpg_gateway", method: :post do %>
…(略)
<% end %>
但測試結果是不行的。
網上很多舊的教學文章引導到這裡但是實際上post出去是失敗的,後來我開始去看官方文件,Pay2Go的說需要:MerchantID 商店代號
Version 版本請帶1.0
TradeInfo 交易資料 AES 加密
TradeSha 交易資料 SHA256 加密
但我嘗試了許久終究會是TradeSha錯誤,網上也說很有可能是AES 加密先錯誤造成SHA256 加密錯誤,我也試了不下幾個方法,最後才看到文件上說要用Spgateway的套件去做才猜測是不是Pay2Go的套件和測試平台不能用了。
再來換成Spgateway的套件和他的測試平台去實作,那就去把action位置改為Spgateway的測試API吧!1
2
3<%= form_tag action="https://ccore.spgateway.com/MPG/mpg_gateway", method: :post do %>
…(略)
<% end %>
再到Spgateway測試平台像Pay2Go一樣建立商店取得商店代號和key,把信用卡服務什麼的都打開,然後去修改config/initializers/pay2go.rb把商店代號和key填進去。
結果報的錯誤是檢查碼錯誤...
,檢查碼到底是什麼官方文件上都沒有寫,後來一個一個刪除去找發現是CheckValue
這個東西有問題,因為當把他從_pay_with_credit_card.html.erb移除後會報錯檢查碼不可空白...
,CheckValue又在官方文件上都沒有提到…就這樣嘗試了幾回合後發現自己真的無法通靈就先告一段落了…
此次是我錯誤的結果紀錄,但我發現串正式機的話似乎不用驗證CheckValue,但要串正式機建立真實商店就不是這麼容易了…
那其他的串金流也沒有像這個這麽好串可以callback回來我的localhost,也許是錯過最好的時代了…(苦笑)